#ifndef MA_CHAR_H
#define MA_CHAR_H

#include <iostream>
#include <vector>
#include <cstdint>
#include <cassert>

// 定义字库的宽度和高度常量
constexpr int FONT_8x8_WIDTH = 8;
constexpr int FONT_8x8_HEIGHT = 8;
constexpr int FONT_16x16_WIDTH = 16;
constexpr int FONT_16x16_HEIGHT = 16;

// 字符点阵结构体，使用 std::vector<uint8_t> 管理点阵数据
using CharBitmap = std::vector<uint8_t>;

// 字符集结构体
struct CharEncoding
{
    uint32_t unicode;  // 字符的 Unicode 编码
    CharBitmap bitmap; // 字符的点阵数据
};

// 字库结构体
struct Font
{
    int width;                       // 字库的宽度
    int height;                      // 字库的高度
    std::vector<CharEncoding> chars; // 字库中所有字符的数组
};

// 例子：存储字符 'A' 和 'B' 的点阵数据（假设为8x8的点阵）
const CharBitmap char_a_8x8 = {
    0x7E, // 0111 1110
    0x42, // 0100 0010
    0x42, // 0000 1001
    0x7E, // 0000 1001
    0x42, // 0000 1001
    0x42, // 0000 1001
    0x42, // 0000 1001
    0x00  // 0000 0000
};

const CharBitmap char_b_8x8 = {
    0x7F, // 0111 1111
    0x41, // 0000 1001
    0x41, // 0000 1001
    0x7F, // 0111 1111
    0x41, // 0000 1001
    0x41, // 0000 1001
    0x7F, // 0111 1111
    0x00  // 0000 0000
};

// 字符集数组，包含不同尺寸的字符点阵数据
const std::vector<CharEncoding> font_8x8_chars = {
    {L'A', char_a_8x8}, // 'A' 的点阵数据 8x8
    {L'B', char_b_8x8}, // 'B' 的点阵数据 8x8
};

const CharBitmap A_16x16 = {
    0x00, 0x00, // 0000000000000000
    0x00, 0xF0, // 0000000011110000
    0x00, 0xFC, // 0000000111111000
    0x00, 0xFE, // 0000000111111100
    0x00, 0xEE, // 0000000111011100
    0x00, 0xCE, // 0000000110011100
    0x01, 0xFE, // 0000001111111110
    0x01, 0xFE, // 0000001111111110
    0x00, 0xEE, // 0000001100011100
    0x00, 0xEE, // 0000001100011100
    0x01, 0xFE, // 0000001111111110
    0x01, 0xFE, // 0000001111111110
    0x00, 0xEE, // 0000001100011100
    0x00, 0xEE, // 0000001100011100
    0x00, 0xEE, // 0000001100011100
    0x00, 0xEE  // 0000001100011100
};

const CharBitmap B_16x16 = {
    0x00, 0x00, // 0000000000000000
    0x00, 0xF8, // 0000001111111000
    0x00, 0xFC, // 0000001111111100
    0x00, 0xF6, // 0000001111011100
    0x00, 0xF6, // 0000001111011100
    0x00, 0xFC, // 0000001111111100
    0x00, 0xFC, // 0000001111111100
    0x00, 0xF3, // 0000001110011100
    0x00, 0xF3, // 0000001110011100
    0x00, 0xFC, // 0000001111111100
    0x00, 0xFC, // 0000001111111100
    0x00, 0xF6, // 0000001111011100
    0x00, 0xF6, // 0000001111011100
    0x00, 0xFC, // 0000001111111100
    0x00, 0xF8, // 0000001111111000
    0x00, 0x00  // 0000000000000000
};

const std::vector<CharEncoding> font_16x16_chars = {
    {L'A', A_16x16}, // 'A' 的点阵数据 16x16
    {L'B', B_16x16}, // 'B' 的点阵数据 16x16
};

extern Font *g_currentFont;

// 检查点阵数据的大小是否有效
bool IsBitmpaSizeValid(const Font *font, const CharBitmap &bitmap);

// 获取字符的点阵数据
const CharBitmap *FindCharBitmap(const Font *font, uint32_t unicode);

// 打印字符的点阵数据
void PrintBitmap(const CharBitmap *bitmap);

// 测试字库
void TestFont(const Font *font, uint32_t unicode);

int TesChar();

#endif